/**
 * 此工具类（OssUtil）旨在提供一个便捷的方法，用于与阿里云对象存储服务（OSS）进行交互，
 * 特别是针对文件资源（如图片）的上传操作。通过本类，用户可以将本地文件安全地上传至指定的阿里云OSS仓库，并获取到上传后文件的HTTP访问URL。
 *
 * @author [ken]
 * @since [3]
 */

package com.ken.common.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.File;

/**
 * OssUtil 类
 */
public class OssUtil {

    /**
     * 阿里云OSS服务默认终端节点
     */
    private static final String endpoint = "oss-cn-beijing.aliyuncs.com";

    /**
     * 阿里云OSS访问密钥ID
     */
    private static final String OSS_ACCESS_KEY_ID = "LTAI5tNKxg2XnjmJVX4oNwTH";

    /**
     * 阿里云OSS访问密钥Secret
     */
    private static final String OSS_ACCESS_KEY_SECRET = "OUSxmYO7NMVWhELQwG90tvdJ7HQHUQ";

    /**
     * 阿里云OSS存储空间名称
     */
    private static final String bucketName = "ken-rjb";

    /**
     * 上传文件至阿里云OSS方法.
     * 将指定的本地文件上传至OSS bucket，并返回上传后文件的HTTPS访问路径。
     *
     * @param file       需要上传的本地文件对象
     * @param fileName   在OSS bucket中保存文件时使用的文件名
     * @return           返回上传成功后的文件在阿里云OSS上的完整HTTP访问链接
     * @throws Exception 如果在上传过程中遇到网络问题或OSS服务返回错误，则可能抛出异常
     */
    public static String upload(File file, String fileName) throws Exception {
        // 创建OSS客户端实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);

        try {
            // 构建PutObjectRequest请求对象
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);

            // （可选）设置存储类型和访问权限
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 执行文件上传操作
            PutObjectResult result = ossClient.putObject(putObjectRequest);

            // 文件上传成功后构建并返回其HTTP访问路径
            StringBuilder stringBuilder = new StringBuilder("https://");
            stringBuilder
                    .append(bucketName)
                    .append(".")
                    .append(endpoint)
                    .append("/")
                    .append(fileName);
            return stringBuilder.toString();

        } catch (OSSException oe) {
            // 输出OSS服务端错误信息
            System.out.println("阿里云OSS服务拒绝请求，错误原因如下：");
            System.out.println("Error Message: " + oe.getErrorMessage());
            System.out.println("Error Code: " + oe.getErrorCode());
            System.out.println("Request ID: " + oe.getRequestId());
            System.out.println("Host ID: " + oe.getHostId());

            throw oe; // 或者可以选择重新包装为自定义异常

        } catch (Exception ce) {
            // 输出客户端内部错误信息
            System.out.println("在与阿里云OSS通信过程中发生严重内部错误：");
            System.out.println("Error Message: " + ce.getMessage());

            throw ce; // 或者可以选择重新包装为自定义异常

        } finally {
            // 关闭OSS客户端连接
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}